<!DOCTYPE html>
<html>
<head><meta name="generator" content="Hexo 3.8.0">
  <meta charset="utf-8">
  
  <title>OAuth2认证方式 | gdme1320 的笔记</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="Table of Contents   Intro Authorization Code  Authorization Request Authorization Response Token Request Token Response   Implicit Resource Owner Password Credentials Client Credentials  Request Re">
<meta property="og:type" content="article">
<meta property="og:title" content="OAuth2认证方式">
<meta property="og:url" content="http://gdme1320.gitee.com/rfc/rfc6749-oauth2/index.html">
<meta property="og:site_name" content="gdme1320 的笔记">
<meta property="og:description" content="Table of Contents   Intro Authorization Code  Authorization Request Authorization Response Token Request Token Response   Implicit Resource Owner Password Credentials Client Credentials  Request Re">
<meta property="og:locale" content="default">
<meta property="og:image" content="http://gdme1320.gitee.com/rfc/rfc6749-oauth2/.oauth/authorization-code-seq.png">
<meta property="og:image" content="http://gdme1320.gitee.com/rfc/rfc6749-oauth2/.oauth/implicit-seq.png">
<meta property="og:updated_time" content="2022-03-23T09:59:16.405Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="OAuth2认证方式">
<meta name="twitter:description" content="Table of Contents   Intro Authorization Code  Authorization Request Authorization Response Token Request Token Response   Implicit Resource Owner Password Credentials Client Credentials  Request Re">
<meta name="twitter:image" content="http://gdme1320.gitee.com/rfc/rfc6749-oauth2/.oauth/authorization-code-seq.png">
  
    <link rel="alternate" href="/atom.xml" title="gdme1320 的笔记" type="application/atom+xml">
  
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  

  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">

  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" integrity="sha384-XdYbMnZ/QjLh6iI4ogqCTaIjrFk87ip+ekIjefZch0Y+PvJ8CDYtEs1ipDmPorQ+" crossorigin="anonymous">

  <link rel="stylesheet" href="/css/styles.css">
  <link rel="stylesheet" href="/css/docs.min.css">
  

</head>
</html>
<body>
  <nav class="navbar navbar-inverse">
  <div class="container">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#main-menu-navbar" aria-expanded="false">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      
    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="main-menu-navbar">
      <ul class="nav navbar-nav">
        
          <li><a class href="/index.html">Home</a></li>
        
          <li><a class href="/archives/">Archives</a></li>
        
      </ul>

      <!--
      <ul class="nav navbar-nav navbar-right">
        
          <li><a href="/atom.xml" title="RSS Feed"><i class="fa fa-rss"></i></a></li>
        
      </ul>
      -->
    </div><!-- /.navbar-collapse -->
  </div><!-- /.container-fluid -->
</nav>

  <div class="container bs-docs-container">
  
    <div class="row">
        <div class="col-sm-8 blog-main">
          <article id="post-rfc/rfc6749-oauth2" class="article article-type-post" itemscope itemprop="blogPost">

  <header class="article-header">
    
  
    <h1 class="article-title" itemprop="name">
      OAuth2认证方式
    </h1>
  


  </header>

  <div class="article-meta">
    <div class="article-datetime">
  <a href="/rfc/rfc6749-oauth2/" class="article-date"><time datetime="2018-05-31T16:00:00.000Z" itemprop="datePublished">2018-06-01</time></a>
</div>

    
    
  <div class="article-category">
    <a class="article-category-link" href="/categories/rfc/">rfc</a>
  </div>


  </div>
  <div class="article-inner">

    <div class="article-entry" itemprop="articleBody">
      
        
<div id="content">
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#orge5fcd6b">Intro</a></li>
<li><a href="#org07fa2e3">Authorization Code</a>
<ul>
<li><a href="#orge3160c0">Authorization Request</a></li>
<li><a href="#org9243c48">Authorization Response</a></li>
<li><a href="#orge8f30c5">Token Request</a></li>
<li><a href="#org2bebe89">Token Response</a></li>
</ul>
</li>
<li><a href="#org0aae793">Implicit</a></li>
<li><a href="#org9cb02fc">Resource Owner Password Credentials</a></li>
<li><a href="#org53147a9">Client Credentials</a>
<ul>
<li><a href="#orgc0c2073">Request</a></li>
<li><a href="#org06bb373">Response</a></li>
</ul>
</li>
</ul>
</div>
</div>
<blockquote>
<p>
<a href="https://www.rfc-editor.org/rfc/rfc6749.txt" target="_blank" rel="noopener">https://www.rfc-editor.org/rfc/rfc6749.txt</a>
</p>
</blockquote>
<div class="outline-2" id="outline-container-orge5fcd6b">
<h2 id="orge5fcd6b">Intro</h2>
<div class="outline-text-2" id="text-orge5fcd6b">
<p>
在下面中提到的“客户程序”，不是指的用户终端。
</p>
<p>
在客户程序请求资源服务器上资源之前，客户程序需要先在资源服务器关联的授权服务器上注册。
注册之后，授权服务给客户程序一个ClientID和ClientSecret。
ClientId在授权服务器上是唯一的。
ClientSecret就是Secret的。
注册的时候，客户程序还需要提交一个Redirect URI，用于授权成功之后的重定向。
</p>
<p>
OAuth 2.0标准包含了四种授权方式
</p>
</div>
</div>
<div class="outline-2" id="outline-container-org07fa2e3">
<h2 id="org07fa2e3">Authorization Code</h2>
<div class="outline-text-2" id="text-org07fa2e3">
<div class="figure">
<p><img alt="authorization-code-seq.png" src=".oauth/authorization-code-seq.png">
</p>
</div>
<ol class="org-ol">
<li>资源所有者（用户）请求客户程序</li>
<li>客户程序告诉用户通过授权服务（例如Facebook Twitter, Google）来登录</li>
<li>为了让用户去授权服务登录，客户程序将用户重定向到授权服务器。重定向的同时，客户程序也将自己的ClientID发送块过去。</li>
<li>用户在授权服务中登录。成功之后，询问用户是否要将赋予客户程序访问自己的资源的权限。</li>
</ol>
<p>
如果用户选择确定，则用户被重定向至客户程序，重定向的地址就是客户程序向授权服务注册时提交的地址。
如果用户已经登录了授权服务（例如先前登录了，然后选择了“保持登录”），则用户直接被询问是否授权。
</p>
<ol class="org-ol">
<li>重定向到客户程序的时候，授权服务向客户程序发送了一个授权码。</li>
<li>客户程序向授权服务发起请求，将自己的ClientID和ClientSecret和授权码一起发送</li>
<li>授权服务验证之后，返回Access Token</li>
<li>客户程序现在能通过Access Token访问资源服务器了。</li>
</ol>
</div>
<div class="outline-3" id="outline-container-orge3160c0">
<h3 id="orge3160c0">Authorization Request</h3>
<div class="outline-text-3" id="text-orge3160c0">
<table border="2" cellpadding="6" cellspacing="0" frame="hsides" rules="groups">
<colgroup>
<col class="org-left">
<col class="org-left">
<col class="org-left">
</colgroup>
<thead>
<tr>
<th class="org-left" scope="col">Request Parameter</th>
<th class="org-left" scope="col">Value</th>
<th class="org-left" scope="col">Note</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">response_type</td>
<td class="org-left">code</td>
<td class="org-left">org-export-with-sub-superscripts)</td>
</tr>
<tr>
<td class="org-left">client_id</td>
<td class="org-left"> </td>
<td class="org-left">Required</td>
</tr>
<tr>
<td class="org-left">redirect_uri</td>
<td class="org-left"> </td>
<td class="org-left">Optional，注册时提交的重定向地址</td>
</tr>
<tr>
<td class="org-left">scope</td>
<td class="org-left"> </td>
<td class="org-left">Optional</td>
</tr>
<tr>
<td class="org-left">state</td>
<td class="org-left"> </td>
<td class="org-left">Optional but recommended,</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="outline-3" id="outline-container-org9243c48">
<h3 id="org9243c48">Authorization Response</h3>
<div class="outline-text-3" id="text-org9243c48">
<table border="2" cellpadding="6" cellspacing="0" frame="hsides" rules="groups">
<colgroup>
<col class="org-left">
<col class="org-left">
</colgroup>
<thead>
<tr>
<th class="org-left" scope="col">Response Field</th>
<th class="org-left" scope="col">Note</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">code</td>
<td class="org-left">Required</td>
</tr>
<tr>
<td class="org-left">state</td>
<td class="org-left">Required，如果请求中传递了这个参数，返回的值与传递的值相同</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="outline-3" id="outline-container-orge8f30c5">
<h3 id="orge8f30c5">Token Request</h3>
<div class="outline-text-3" id="text-orge8f30c5">
<table border="2" cellpadding="6" cellspacing="0" frame="hsides" rules="groups">
<colgroup>
<col class="org-left">
<col class="org-left">
<col class="org-left">
</colgroup>
<thead>
<tr>
<th class="org-left" scope="col">Request Parameters</th>
<th class="org-left" scope="col">Value</th>
<th class="org-left" scope="col">Note</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">client_id</td>
<td class="org-left"> </td>
<td class="org-left">Required</td>
</tr>
<tr>
<td class="org-left">client_secret</td>
<td class="org-left"> </td>
<td class="org-left">Required</td>
</tr>
<tr>
<td class="org-left">grant_type</td>
<td class="org-left">authorization_code</td>
<td class="org-left">Must be “authorization_code"</td>
</tr>
<tr>
<td class="org-left">code</td>
<td class="org-left"> </td>
<td class="org-left">Required</td>
</tr>
<tr>
<td class="org-left">redirect_uri</td>
<td class="org-left"> </td>
<td class="org-left">如果authorization request中包含了这个参数，则这里也必须</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="outline-3" id="outline-container-org2bebe89">
<h3 id="org2bebe89">Token Response</h3>
<div class="outline-text-3" id="text-org2bebe89">
<table border="2" cellpadding="6" cellspacing="0" frame="hsides" rules="groups">
<colgroup>
<col class="org-left">
<col class="org-left">
</colgroup>
<thead>
<tr>
<th class="org-left" scope="col">Response Field</th>
<th class="org-left" scope="col">Note</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">access_token</td>
<td class="org-left"> </td>
</tr>
<tr>
<td class="org-left">token_type</td>
<td class="org-left"> </td>
</tr>
<tr>
<td class="org-left">expires_in</td>
<td class="org-left">Optional, 过期时间</td>
</tr>
<tr>
<td class="org-left">refresh_token</td>
<td class="org-left">这个token过期之后，使用refresh_token获取新的</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="outline-2" id="outline-container-org0aae793">
<h2 id="org0aae793">Implicit</h2>
<div class="outline-text-2" id="text-org0aae793">
<div class="figure">
<p><img alt="implicit-seq.png" src=".oauth/implicit-seq.png">
</p>
</div>
<ol class="org-ol">
<li>用户请求客户程序</li>
<li>客户程序告诉用户去授权服务登录</li>
<li>用户前往授权服务，如果用户没有登录则先登录，然后选择是否授权</li>
<li>授权成功，重定向到Redirect URI，并将Accss Token直接附在url上，不是授权码了。</li>
<li>客户程序收到了Access Token，就能用来请求资源了。</li>
</ol>
<p>
这种方式的安全度就降低了。Access Token能够被用户代理（假如是个中了毒的浏览器）访问到。
并且ClientID和ClientSecret也要通过用户代理发送给授权服务器。
</p>
<p>
这种方式适用于内部程序的授权，或者本地应用程序。
</p>
</div>
</div>
<div class="outline-2" id="outline-container-org9cb02fc">
<h2 id="org9cb02fc">Resource Owner Password Credentials</h2>
<div class="outline-text-2" id="text-org9cb02fc">
<p>
用户将自己的（Twitter, Facebook等）的账号和密码提交给客户程序，然后客户程序使用该账号密码请求资源。
</p>
<p>
除非特别信任，一般人不会将自己的账号密码交给第三方保管。
</p>
</div>
</div>
<div class="outline-2" id="outline-container-org53147a9">
<h2 id="org53147a9">Client Credentials</h2>
<div class="outline-text-2" id="text-org53147a9">
<p>
这种方式适用于当客户程序需要调用资源服务器上的方法，面不是请求与用户相关的资源时。
</p>
</div>
<div class="outline-3" id="outline-container-orgc0c2073">
<h3 id="orgc0c2073">Request</h3>
<div class="outline-text-3" id="text-orgc0c2073">
<table border="2" cellpadding="6" cellspacing="0" frame="hsides" rules="groups">
<colgroup>
<col class="org-left">
<col class="org-left">
</colgroup>
<thead>
<tr>
<th class="org-left" scope="col">Request Parameter</th>
<th class="org-left" scope="col">Value</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">grant_type</td>
<td class="org-left">client_credentials</td>
</tr>
<tr>
<td class="org-left">scope</td>
<td class="org-left">Optional</td>
</tr>
</tbody>
</table>
<p>
除此之外，需要证明自己的身份，通过添加额外的  client_id   client_secret  参数，或以 Basic的方式，将两个参数设置到请求头部。
例如：
</p>
<pre class="example">
POST /token HTTP/1.1
Host: authorization-server.com
 
grant_type=client_credentials
&amp;client_id=xxxxxxxxxx
&amp;client_secret=xxxxxxxxxx
</pre>
</div>
</div>
<div class="outline-3" id="outline-container-org06bb373">
<h3 id="org06bb373">Response</h3>
<div class="outline-text-3" id="text-org06bb373">
<table border="2" cellpadding="6" cellspacing="0" frame="hsides" rules="groups">
<colgroup>
<col class="org-left">
<col class="org-left">
</colgroup>
<thead>
<tr>
<th class="org-left" scope="col">Response Field</th>
<th class="org-left" scope="col">Note</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">access_token</td>
<td class="org-left"> </td>
</tr>
<tr>
<td class="org-left">token_type</td>
<td class="org-left"> </td>
</tr>
<tr>
<td class="org-left">expires_in</td>
<td class="org-left">过期时间， Optional</td>
</tr>
</tbody>
</table>
<p>
这种授权方式中不应该返回refresh token
</p>
</div>
</div>
</div>
</div>
<div class="status" id="postamble">
<p class="date">Date: 2018-06-01</p>
<p class="author">Author: gdme1320</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer" target="_blank" rel="noopener">Validate</a></p>
</div>

      
    </div>

    
      

    

    <footer class="article-footer">
      <a data-url="http://gdme1320.gitee.com/rfc/rfc6749-oauth2/" data-id="cl13eo7k7008xhjv46lpnelwy" class="article-share-link">
        <i class="fa fa-share"></i> Share
      </a>
      
      

    </footer>
  </div>
  
    
<ul id="article-nav" class="nav nav-pills nav-justified">
  
  <li role="presentation">
    <a href="/python/import/" id="article-nav-older" class="article-nav-link-wrap">
      <i class="fa fa-chevron-left pull-left"></i>
      <span class="article-nav-link-title">Python Import</span>
    </a>
  </li>
  
  
  <li role="presentation">
    <a href="/java/maven/" id="article-nav-newer" class="article-nav-link-wrap">
      <span class="article-nav-link-title">maven笔记</span>
      <i class="fa fa-chevron-right pull-right"></i>
    </a>
  </li>
  
</ul>


  
</article>




        </div>
        <div class="col-sm-3 col-sm-offset-1 blog-sidebar">
          
  
  <div class="sidebar-module">
    <h4>Categories</h4>
    <ul class="sidebar-module-list"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/apps/">apps</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/architecture/">architecture</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/devops/">devops</a><span class="sidebar-module-list-count">10</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/devops/kubectl/">kubectl</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/devops/kubernetes/">kubernetes</a><span class="sidebar-module-list-count">3</span></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/dotnet/">dotnet</a><span class="sidebar-module-list-count">3</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/dotnet/entityframework/">entityframework</a><span class="sidebar-module-list-count">1</span></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/elasticsearch/">elasticsearch</a><span class="sidebar-module-list-count">4</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/emacs/">emacs</a><span class="sidebar-module-list-count">4</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/emacs/org-mode/">org-mode</a><span class="sidebar-module-list-count">3</span></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/git/">git</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/graphql/">graphql</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/groovy/">groovy</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/">java</a><span class="sidebar-module-list-count">52</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/concurrent/">concurrent</a><span class="sidebar-module-list-count">4</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/jackson/">jackson</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/shiro/">shiro</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/spring/">spring</a><span class="sidebar-module-list-count">11</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/spring-amqp/">spring-amqp</a><span class="sidebar-module-list-count">5</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/spring-amqp/spring-jpa/">spring-jpa</a><span class="sidebar-module-list-count">1</span></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/spring-jpa/">spring-jpa</a><span class="sidebar-module-list-count">10</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/spring-security/">spring-security</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/thymeleaf/">thymeleaf</a><span class="sidebar-module-list-count">2</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/thymeleaf/maven/">maven</a><span class="sidebar-module-list-count">1</span></li></ul></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/jenkins/">jenkins</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/journal/">journal</a><span class="sidebar-module-list-count">7</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/js/">js</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/linux/">linux</a><span class="sidebar-module-list-count">35</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/linux/kde/">kde</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/linux/kross/">kross</a><span class="sidebar-module-list-count">3</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/linux/kross/ktorrent-scripts/">ktorrent-scripts</a><span class="sidebar-module-list-count">1</span></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/linux/shell/">shell</a><span class="sidebar-module-list-count">6</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/linux/tcp/">tcp</a><span class="sidebar-module-list-count">1</span></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/lisp/">lisp</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/mongodb/">mongodb</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/mssql/">mssql</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/mysql/">mysql</a><span class="sidebar-module-list-count">12</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/nginx/">nginx</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/node/">node</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/postgresql/">postgresql</a><span class="sidebar-module-list-count">2</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/postgresql/client/">client</a><span class="sidebar-module-list-count">1</span></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/python/">python</a><span class="sidebar-module-list-count">19</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/regex/">regex</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/rfc/">rfc</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/vim/">vim</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/windows/">windows</a><span class="sidebar-module-list-count">7</span></li></ul>
  </div>



  
  <div class="sidebar-module">
    <h4>Tags</h4>
    <ul class="sidebar-module-list"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/tags/ReentrantLock/">ReentrantLock</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/tags/nohup/">nohup</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/tags/pandoc/">pandoc</a><span class="sidebar-module-list-count">1</span></li></ul>
  </div>



  
  <div class="sidebar-module">
    <h4>Tag Cloud</h4>
    <p class="tagcloud">
      <a href="/tags/ReentrantLock/" style="font-size: 10px;">ReentrantLock</a> <a href="/tags/nohup/" style="font-size: 10px;">nohup</a> <a href="/tags/pandoc/" style="font-size: 10px;">pandoc</a>
    </p>
  </div>


  
  <div class="sidebar-module">
    <h4>Archives</h4>
    <ul class="sidebar-module-list"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2919/06/">June 2919</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2022/03/">March 2022</a><span class="sidebar-module-list-count">58</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2022/01/">January 2022</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2021/11/">November 2021</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2021/10/">October 2021</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2021/04/">April 2021</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2021/03/">March 2021</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2021/02/">February 2021</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2021/01/">January 2021</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/12/">December 2020</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/11/">November 2020</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/10/">October 2020</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/09/">September 2020</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/07/">July 2020</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/06/">June 2020</a><span class="sidebar-module-list-count">10</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/04/">April 2020</a><span class="sidebar-module-list-count">4</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/03/">March 2020</a><span class="sidebar-module-list-count">8</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/02/">February 2020</a><span class="sidebar-module-list-count">4</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/01/">January 2020</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/12/">December 2019</a><span class="sidebar-module-list-count">7</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/11/">November 2019</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/10/">October 2019</a><span class="sidebar-module-list-count">11</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/09/">September 2019</a><span class="sidebar-module-list-count">6</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/08/">August 2019</a><span class="sidebar-module-list-count">4</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/07/">July 2019</a><span class="sidebar-module-list-count">10</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/06/">June 2019</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/05/">May 2019</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/04/">April 2019</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/03/">March 2019</a><span class="sidebar-module-list-count">8</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/02/">February 2019</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/01/">January 2019</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2018/11/">November 2018</a><span class="sidebar-module-list-count">4</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2018/10/">October 2018</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2018/08/">August 2018</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2018/07/">July 2018</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2018/06/">June 2018</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2018/03/">March 2018</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2017/07/">July 2017</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2017/06/">June 2017</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2017/04/">April 2017</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2015/05/">May 2015</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/1970/01/">January 1970</a><span class="sidebar-module-list-count">9</span></li></ul>
  </div>



  
  <div class="sidebar-module">
    <h4>Recents</h4>
    <ul class="sidebar-module-list">
      
        <li>
          <a href="/java/acessing-generic-types-at-runtime/">获取泛型类型</a>
        </li>
      
        <li>
          <a href="/linux/shell/bash_cgi/">Script for Shell Parsing Parameters</a>
        </li>
      
        <li>
          <a href="/linux/shell/shell-script/">Shell Script Getting Start</a>
        </li>
      
        <li>
          <a href="/linux/tcp/network-tcp-performance-turning-with-sysctl/">【翻译】Sysctl调节Linux网络性能</a>
        </li>
      
        <li>
          <a href="/java/concurrent/aqs-src/">AQS源码笔记</a>
        </li>
      
    </ul>
  </div>



        </div>
    </div>
  </div>
  <footer class="blog-footer">
  <div class="container">
    <div id="footer-info" class="inner">
      &copy; 2022 gdme1320<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>

  

<!-- <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js" integrity="sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx" crossorigin="anonymous"></script> -->

<script src="/js/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>



<script src="/js/script.js"></script>

</body>
</html>
